package com.yj.springbootstudy.mulThread.imooc;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 第一个线程先调用 start 方法，沉睡 20 毫秒后调用第二个线程的 start 方法，确保第一个线程先获取锁，第二个线程进入等待；
 * 最后调用第二个线程的 interrupt 方法，终止线程；
 * run 方法的逻辑为打印 0，1，2，3，4，每打印一个数字前，先沉睡 1000 毫秒；
 * 观察结果，看是否第二个线程被终止。
 */
public class Demo03 {

    static Lock lock = new ReentrantLock();

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(()->{
            try {
                lock.lockInterruptibly();
                for (int i = 0; i < 5 ; i++) {
                    Thread.sleep(1000);
                    System.out.println(Thread.currentThread().getName()+":"+i);
                }
            }catch (Exception e){
                System.out.println(Thread.currentThread().getName() +"被打断！");
            }finally {
                lock.unlock();
            }
        },"t1");

        Thread t2 = new Thread(()->{
            try {
                lock.lockInterruptibly();
                for (int i = 0; i < 5 ; i++) {
                    Thread.sleep(1000);
                    System.out.println(Thread.currentThread().getName()+":"+i);
                }
            }catch (Exception e){
                System.out.println(Thread.currentThread().getName() +"被打断！");
            }finally {
                try {
                    lock.unlock();
                } catch (Exception e) {
                    System.out.println(Thread.currentThread().getName() + "没有得到锁的线程运行结束！");
                }
            }
        },"t2");

        t1.start();
        Thread.sleep(20);
        t2.start();
        t2.interrupt();
        t1.join();
        t2.join();

    }
}
